package me.util;

import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * 定义一个通用工厂类，用于创建各种类对象
 *
 * @author Rainh
 */
public class Factory {

//    // 定义bean，通用类型
//    private static Object bean;
    //创建属性对象
    private static Properties properties;
    //定义map集合用于存放key名和对象bean
    private static Map<String,Object> maps;

    static {
        //实例化map对象
        maps = new HashMap<String,Object>();
        //实例化属性对象
        properties = new Properties();
        //获取配置文件
        InputStream is = Factory.class.getClassLoader().getResourceAsStream("bean.properties");
        //将配置文件加载到属性文件中
        try {
            //加载配置文件
            properties.load(is);
            //获取所有的key
            Enumeration<Object> keys = properties.keys();
            //遍历所有的key
            while (keys.hasMoreElements()){
                String key = keys.nextElement().toString();
                Object bean = getBean(key);
                maps.put(key,bean);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 通过key获取对象，这是多例模式
     * @param beanName
     * @return
     * @throws ClassNotFoundException
     * @throws IllegalAccessException
     * @throws InstantiationException
     */
    public static Object getBeans(String beanName) {
        //通过输入的key获取value属性
        String property = properties.getProperty(beanName);
        try {
            //通过属性名(包名)获取字节码文件,直接返回
            Class cls = Class.forName(property);
            //通过字节码文件获取类对象
            return cls.newInstance();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        //返回要获取的对象，如果没有正确执行就是空的
        return null;
    }

    /**
     * 这是单例模式
     * @param beanName
     * @return
     */
    public static Object getBean(String beanName){
        //通过key获取对象
        Object bean = maps.get(beanName);
        return bean;
    }

}
